package com.dfqy.front;

import com.dfqy.config.EventConfig;
import com.dfqy.pojo.*;
import com.dfqy.service.EventService;
import com.dfqy.vo.Page;
import com.dfqy.vo.Result;
import io.swagger.annotations.*;
import org.hibernate.validator.constraints.Range;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Author : atyushu
 * Package : com.dfqy.front
 * ClassName : EventFrontController
 * Create : 2023/8/1 - 19:30
 * Version : v1.0
 * Description : The class of controller for event.
 */
@Validated
@RestController
@Api(tags = "EventFrontController", description = "活动讲座")
@RequestMapping("front/event")
public class EventFrontController {

    @Autowired
    private EventService eventService;

    @Autowired
    private EventConfig eventConfig;

    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        simpleDateFormat.setLenient(false);
        webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(simpleDateFormat, true));
    }

    @ApiOperation("获取所有的addr<城市>, 用于带条件搜索时, 展现城市的搜索条件, (东方启音官网参考, 点击: 首页 --> 新闻活动 --> 活动讲座 --> 更多 -- > 上方搜索按钮 --> 兴趣; 直达地址: https://www.ostcn.com/activity/search)")
    @GetMapping("getAddr")
    public Result getAddr() {
        String[] addr = eventConfig.getAddr();
        return addr == null ? Result.error("无数据") : Result.success(addr);
    }

    @ApiOperation("获取所有的stype<类型>, 用于带条件搜索时, 展现类型的搜索条件, (东方启音官网参考, 点击: 首页 --> 新闻活动 --> 活动讲座 --> 更多 -- > 上方搜索按钮 --> 兴趣; 直达地址: https://www.ostcn.com/activity/search)")
    @GetMapping("getStype")
    public Result getStype() {
        String[] stype = eventConfig.getStype();
        return stype == null ? Result.error("无数据") : Result.success(stype);
    }

    @ApiOperation("根据编号, 查询单个活动讲座信息, 采用RESTFul格式, 用于活动讲座详情页, (着重注意: 当用户, 在具体活动详情页, 点击参加并提交时, 请一并将当前活动编号, 一起提交, 即eventid), (东方启音官网参考, 点击: 首页 --> 新闻活动 --> 活动讲座 --> 点击具体活动讲座; 直达地址: https://www.ostcn.com/activity/238)")
    @GetMapping("/{id}")
    public Result getById(@PathVariable @ApiParam(name = "id", value = "编号", required = true) long id) {
        eventService.updateVisitnums(id);
        Event event = eventService.getById(id);
        return event != null ? Result.success(event) : Result.error("无数据");
    }

    @ApiOperation("获取所有活动讲座信息, 用于活动讲座列表页展现, 包含字段id<编号>, starttime<活动开始时间>, finishtime<活动结束时间>, addr<活动地址>, coverimage<列表页预览图>, title<活动标题>, (着重注意: id<活动编号！！！！！！务必将活动编号, 绑定于对应的列表元素上, 用户点击此列表后, 需要依据此编号, 再次请求getById接口, 来获取活动详情> finishtime<结束时间!!!!!! 注意活动状态的处理, 依据结束时间, 展示活动是否已结束>), (东方启音官网参考, 点击: 首页 --> 新闻活动 --> 活动讲座; 直达地址: https://www.ostcn.com/activity)")
    @PostMapping("getAll")
    public Result getAll() {
        List<Event> events = eventService.getAll();
        return events == null ? Result.error("无数据") : Result.success(events);
    }

    @ApiOperation("根据条件, 查询活动讲座信息, 用于带有条件查询的, 活动讲座列表页展现, (着重注意: 在官网示例中, 此页面, 提供了三个, 可进行排序的按钮, 依次为: 最新发布、最多点击、参加最多; 请将这三个按钮, 设置为单选, 并且值为固定的, 依次为: name = 'orderBy' value = 'posttime/visitnums/joinnums'), (东方启音官网参考, 点击: 首页 --> 新闻活动 --> 活动讲座 --> 更多; 直达地址: https://www.ostcn.com/activity/search)")
    @PostMapping("search")
    public Result search(@RequestParam(value = "stype", required = false) @ApiParam(name = "stype", value = "类型, 即兴趣") String stype,
                         @RequestParam(value = "addr", required = false) @ApiParam(name = "addr", value = "城市") String addr,
                         @RequestParam(value = "orderBy", required = false) @ApiParam(name = "orderBy", value = "排序条件") String orderBy
    ) {
        List<Event> events = eventService.search(addr, stype, orderBy);
        return events == null ? Result.error("无数据") : Result.success(events);
    }

    @ApiOperation("获取浏览最多的热门活动标题，用于首页的展现，官网示例，位于首页最下方，言语科普的右侧，返回的字段，包含：title<标题> , posttime<发布时间>")
    @GetMapping("getTitle")
    public Page<Event> getTitle(@RequestParam(name = "page", defaultValue = "1") @ApiParam(name = "page", value = "页码", defaultValue = "1") @Range(min = 1, message = "页码过小") int page,
                                @RequestParam(name = "limit", defaultValue = "5") @ApiParam(name = "limit", value = "条数", defaultValue = "5") @Range(min = 1, message = "条数过小") int limit) {
        return eventService.getTitle(page, limit);
    }
}